//
//  main.m
//  04-Foundation-NSArray
//
//  Created by Jason on 15/9/29.
//  Copyright © 2015年 Jason. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

void arrayUse();
void arrayUse2();
void arrayMemory();
void arrayString();
void arrayExport();
void arrayImport();

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
//        arrayUse2();
//        arrayMemory();
//        arrayString();
//        arrayExport();
        arrayImport();
        
    }
    return 0;
}


#pragma mark 可变数组长度的数组
void mutableArray() {
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"jim", nil];
    // 每添加一个对象到数组中,都会对这个元素做一次retain操作
    // 每删除一个元素,都会对这个元素做一次release操作
    // 当数组被销毁的时候,数组中的所有元素都会做一次release操作
    [array addObject:@"jack"];
    [array addObject:@"mike"];
    
    
//    [array replaceObjectAtIndex:<#(NSUInteger)#> withObject:<#(nonnull id)#>] 替换
//    [array removeObjectAtIndex:1]; 删除
    
}


#pragma mark 数组的读取
void arrayImport() {
    
    NSArray *array  = [NSArray arrayWithContentsOfFile:@"/Users/hezhiyong/Desktop/jason.txt"];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        NSLog(@"%zd ----- %@", idx, obj);
        
    }];
    
}

#pragma mark 数组的导出
void arrayExport() {
    
    /*
    NSString *str = @"123Aadfadfadfadfaf";
    [str writeToFile:@"/Users/jason/Desktop/jason.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    */
    
    // 将数组保存到文件里
    NSArray *array = [NSArray arrayWithObjects:@"哈哈哈哈",@"嘿嘿",@"asdasd", nil];
    
//    NSURL *url = [NSURL URLWithString:@"file:///Users/jason/Desktop/jason.txt"];
//    [array writeToURL:url atomically:YES];
    
    [array writeToFile:@"/Users/hezhiyong/Desktop/jason.txt" atomically:YES];
}


#pragma mark 数组和字符串的用法

void arrayString2() {
    
    NSString *str = [NSString stringWithContentsOfFile:@"User/jason/Desktop/jason.txt" encoding:NSUTF8StringEncoding error:nil];
    
    // 解析出文件中的每一行内容
    NSArray *array = [str componentsSeparatedByString:@"\n"];
    
    [array  enumerateObjectsUsingBlock:
     ^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
         NSLog(@"第%zd行的内容:%@", idx, obj);
     }];
    
}

void arrayString() {
    
    NSString *str = @"mike-jason-jack-jim";
    
    // 利用中划线 - 来分割字符串
    NSArray *array = [str componentsSeparatedByString:@"-"];
    
    NSLog(@"%@",array);
    
    
    // 把数组中的所有元素用*连接成一个新的字符串
    NSString *str2 = [array componentsJoinedByString:@"*"];
    NSLog(@"%@",str2);
    
}

#pragma mark 数组的内存管理
void arrayMemory() {
    // p1 : 1
    Person *p1 = [[Person alloc] init];
    p1.age = 11;
    // p2 : 1
    Person *p2 = [[Person alloc] init];
    p2.age = 12;
    // 每当有一个对象被添加到NSArray中时,会对这个对象做一次retain操作
    // p1 : 2
    // p2 : 2
    // array : 1
    NSArray *array = [[NSArray alloc] initWithObjects:p1,p2, nil];
    
    // p1 : 1
    [p1 release];
    
    // 当数组(NSArray)对象被销毁的时候,会对内部存储的所有对象做一次release操作
    // array : 0
    // p1 : 0
    // p2 : 1
    [array release];
    
    // p2 : 0
    [p2 release];
    
    
}


#pragma mark 数组的使用方式

void arrayUse2() {
    // unrecognized selector sent to instance 0x100306e50  调用了某个对象不存在的方法
    Person *p1 = [Person personWithAge:10];
    Person *p2 = [Person personWithAge:20];
    Person *p3 = [Person personWithAge:30];

    NSArray *array = [NSArray arrayWithObjects:p1,p2,p3, nil];
    
    
    // SEL 是方法的包装类型
//    SEL sel = @selector(study);
//    [array makeObjectsPerformSelector:sel];
    [array makeObjectsPerformSelector:@selector(study)];
    
    
}


void arrayUse() {
    
    Person *p = [[[Person alloc] init] autorelease];
    NSArray *array = [NSArray arrayWithObjects:@"caca",@"hehe", p, nil];
    
//    NSLog(@"%@",array);
    
    // 获取最后一个元素
//    [array lastObject];
    
    [array containsObject:@"caca"];
    
}

#pragma mark 数组的遍历
void arrayFor() {
    NSArray *array = [NSArray arrayWithObjects:@"mikes",@"jason", @"rose",@"lucy", nil];
    
    // 1.最土的方式遍历
    /*
     for (int i = 0; i < array.count; i++) {
     // 通过角标获取对象
     id obj = [array objectAtIndex:i];
     NSLog(@"%d---%@", i, obj);
     // 通过对象获取的是角标
     NSUInteger num = [array indexOfObject:obj];
     NSLog(@"%zd----",num);
     }
     */
    
    // 2.快速遍历 类似java foreach语句
    // 每次遍历都取出元素赋值给obj
    /*
     for(id obj in array) {
     NSLog(@"%@",obj);
     }
     */
    
    // 3.利用block遍历数组
    // 当数组每遍历一个元素时, 就会调用一次block,而且每次传入的参数值都不一样
    [array enumerateObjectsUsingBlock:
     //id obj: 元素
     // NSUInterger idx : 索引、位置、角标
     ^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
         
         NSLog(@"idx=%zd, obj=%@", idx, obj);
         
         if(idx == 2) {
             // 停止
             *stop = YES;
             
         }
         
         
     }];
}

#pragma mark 数组的创建
void arrayCreate() {
    
    // NSArray 只能放OC对象, 不能直接存放基本数据类型,也不能存放nil值
    // NSArray *array = [[NSArray alloc] init]; 创建的是空数组 无法添加 创建就固定长度
    // NSArray *array = [NSArray array]; 同上一样
    
    // 这个数组对象永远只有1个元素:@"mike"
    //        NSArray *array = [NSArray arrayWithObject:@"mike"];
    
    Person *p = [[[Person alloc] init] autorelease];
    NSArray *array = [NSArray arrayWithObjects:p,@"jack",@"mike",@"Jim", nil]; // nil代表数组结束
    
    // 返回元素个数
    NSLog(@"count=%zd",[array count]);
    
    
    /*
     C语言的数组
     Person *p = [[[Person alloc] init] autorelease];
     Person *persons[50] = {
     
     [[[Person alloc] init] autorelease],
     
     [[[Person alloc] init] autorelease],
     
     };
     
     int a = 10;
     int array[5] = {1,2,3,5,7,0};
     */
    
}
